/**
 * @param {string[][]} tickets
 * @return {string[]}
 */
 var findItinerary = function(tickets) {
    let result = ['JFK'] // 结果数组第一个必须是jfk
    let map = {} // map映射关系
    for(let ticket of tickets){
      const [from,to] = ticket // 解析from和to
      if(!map[from]){
        // 如果map中没有这个出发地的位置
        map[from] = [] // 在这个出发地对应的地方创建一个数组
      }
      map[from].push(to) // 将到达地加入到这个map选项中
    }
    for(let city in map){
      // 遍历map中的key 就是出发地
      map[city].sort() // 将map中对应的到达地排序
    }
    function backTracking(){
      if(result.length === tickets.length +1) {
        // 如果结果数组中的个数 是票数的格式+1 表明遍历完了 就返货
        return true
      }
      if(!map[result[result.length - 1]] || !map[result[result.length - 1]].length){
        // 如果结果数组最后一个的元素不存子啊 或者 最后一个元素没有对应的目的地
        // 就返回false
        return false
      }
      for(let i = 0;i < map[result[result.length - 1]].length;i++){
        // 遍历map中结果数组的最后一个元素对应的值
        let city = map[result[result.length - 1]][i] // 将从数组中取出的值赋值给city
        map[result[result.length - 1]].splice(i,1) // 删除已经走过的航线 防止死循环
        result.push(city)
        if(backTracking()){ // 执行backTracking函数 如果返回值是true 就返回true
          return true
        }
        result.pop() // 结果数组中回溯出上一个放入的元素
        map[result[result.length - 1]].splice(i,0,city) // 将原来的补齐
      }
    }
    backTracking()
    return result
};